package Reflect_package1;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

public class Reflect_demo4 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        /*
            Class类中用于获取成员方法的方法：
                Method[] getMethods ()：返回所有公共成员方法对象的数组，包括继承的
                Method[] getDeclaredMethods ()：返回所有成员方法对象的数组，不包括继承的
                Method getMethod (String name, Class<?>...parameterTypes)：返回单个公共成员方法对象
                Method getDeclaredMethod (String name, Class<?>...parameterTypes)：返回单个成员方法对象

            Method类中用于创建对象的方法
                Object invoke (Object obj, Object...args)   运行方法
                参数一：用obj对象调用该方法
                参数二：调用方法的传递参数（如果没有就不写）
                返回值：方法的返回值（如果没有就不写）
         */

        //1、获取class字节码文件对象
        Class<?> clazz = Class.forName("Reflect_package1.Student");

        //2、获取里面所有的方法对象
        Method[] methods1 = clazz.getMethods();
        for (Method method : methods1) {
            System.out.println(method);
        }
        System.out.println("=====================");

        //3、获取里面所有的方法对象（不能获取父类的，但是可以获取本类私有的方法）
        Method[] methods2 = clazz.getDeclaredMethods();
        for (Method method : methods2) {
            System.out.println(method);
        }
        System.out.println("=====================");

        //4、获取单一的公共成员方法
        Method m = clazz.getMethod("sleep");
        System.out.println(m);
        System.out.println("=====================");

        //5、获取单一的成员方法
        Method e = clazz.getDeclaredMethod("eat", String.class);
        System.out.println(e);
        System.out.println("=====================");

        //6、获取方法的修饰符
        int modifiers = m.getModifiers();
        System.out.println(modifiers);

        //获取方法的名字
        String name = m.getName();
        System.out.println(name);

        //获取方法的形参
        Parameter[] parameters = e.getParameters();
        for (Parameter parameter : parameters) {
            System.out.println(parameter);
        }
        System.out.println("=====================");

        //7、获取方法抛出的异常
        Class<?>[] exceptionTypes = m.getExceptionTypes();
        for (Class<?> exceptionType : exceptionTypes) {
            System.out.println(exceptionType);
        }


        //方法运行
//        Object invoke (Object obj, Object...args)   运行方法
//        参数一：用obj对象调用该方法
//        参数二：调用方法的传递参数（如果没有就不写）
//        返回值：方法的返回值（如果没有就不写）
        Student s = new Student();
        e.setAccessible(true);//忽略权限
        Object result = e.invoke(s, "汉堡包");
        System.out.println(result);

    }
}
